import { DmgTypeKey, XAbilityTrgType } from "../../types/L_Type"
import { XAbilityAttr, XAbilityConfig, XAbilityTypeKey } from "../../config/XAbilityConfig"
import UnitX from "../../entity/UnitX"
import L_Run from "../../utils/L_Run"



/** 特殊能力触发计算器
 *  
*/
export default class XAbilityExecutor{
 


    /**
     * 触发单位的XAnility能力
     * @param aux 通常指攻击单位
     * @param bux 防御单位
     * @param trgux 触发行为的目标单位（某些时候从aux bux判定比较混乱 额外增加一个指向）
     * @param trgTypeKey 能力触发类型
     * @param dmgTypeKey 原始伤害类型
     * @param targetWeight 指定的xability权重值  不传使用默认config值
     * @param additTrgProb 是否指定触发几率1-100 不传递时默认为100%触发
     * @returns 
     */
    public static trgAndExecXAbility(aux:UnitX,bux:UnitX,trgux:UnitX,trgTypeKey:XAbilityTrgType,dmgTypeKey?:DmgTypeKey,targetWeight?:number,additTrgProb?:number){
        //先判断第一次触发系数  一般是技能自身的行为触发系数（例如AOE技能 通常会调低触发系数 防止一片一片的触发）
        if(additTrgProb!=undefined && L_Run.RandomInt_L(0,100)>=additTrgProb){
            return
        }

        //单位没有任何关联的特性  直接跳出
        let xAbilitys=trgux.xAbilitysTrgTypeArr(trgTypeKey)
        if(xAbilitys==undefined) return

        for(let i=0;i<xAbilitys.length;i++){
            let k=xAbilitys[i] as XAbilityTypeKey
            let xax=XAbilityConfig[k] as XAbilityAttr
            //触发几率
            if(xax.trgProb<100 && L_Run.RandomInt_L(0,100)>xax.trgProb){
                continue;
            }
            //如果外部指定了权重值  则覆盖掉
            let nExclusiveAttr=xax.exclusiveAttr
            if(targetWeight!=undefined){
                nExclusiveAttr=Object.assign({},nExclusiveAttr, {weight:targetWeight});
            }


            //config配置特效的实现类
            let impObj=new xax.impClass()
            impObj.execXAbility(aux,bux,xax.weight,(dmgTypeKey||'nothing'),nExclusiveAttr)

            
        }
    }


  
}  